package br.com.mobimenu.view.site.abstracts;

import java.lang.reflect.ParameterizedType;
import java.util.Collection;

import br.com.mobimenu.facade.Facade;
import br.com.mobimenu.model.Entidade;
import br.com.mobimenu.persistence.filter.Filtro;
import br.com.mobimenu.persistence.filter.impl.FiltroGeneric;

public abstract class AbstractListMB<ENTIDADE extends Entidade, FILTER extends Filtro> extends AbstractMB {

	public static final String ACAO_LISTAR = "listar";

	public Collection<ENTIDADE> lista;

	private FILTER filtro;

	public AbstractListMB() {

	}

	public String consultar() {
		String navegador = this.tratarConsulta();
		this.consultarEntidade();
		this.getFiltro().clear();
		return navegador;
	}

	@SuppressWarnings("unchecked")
	private void consultarEntidade() {
		Facade facade = this.getFacade();
		Collection<ENTIDADE> lista = (Collection<ENTIDADE>) facade.consultar((FiltroGeneric<?>) this.getFiltro());
		this.setLista(lista);
	}

	public FILTER getFiltro() {
		return this.filtro;
	}

	@SuppressWarnings("unchecked")
	private Class<ENTIDADE> getFiltroClass(){
		Class<ENTIDADE> classe = (Class<ENTIDADE>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1];
		return classe;
	}


	public Collection<ENTIDADE> getLista() {
		return this.lista;
	}

	public String limpar(){
		this.getFiltro().limparCampos();
		return this.tratarLimpar();
	}

	@SuppressWarnings("unchecked")
	public String preConsultar(){
		try {
			this.setAcao(ACAO_LISTAR);
			this.setFiltro((FILTER) this.getFiltroClass().newInstance());
			this.consultarEntidade();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return this.tratarPreConsulta();
	}

	public void setFiltro(FILTER filtro) {
		this.filtro = filtro;
	}

	public void setLista(Collection<ENTIDADE> lista) {
		this.lista = lista;
	}

	public abstract String tratarConsulta();
	public abstract String tratarLimpar();
	public abstract String tratarPreConsulta();

}
